package GEMonitor;

import GEMonitor.em.MsgType;
import cn.hutool.core.util.HexUtil;
import io.netty.buffer.ByteBuf;
//import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

public class GEMsgEncoder extends MessageToByteEncoder<GEMsg> {

    @Override
    protected void encode(ChannelHandlerContext ctx, GEMsg msg, ByteBuf out) throws Exception {
        try {
                if(!out.isWritable())
                {
                    return;
                }
                
                out.writeByte(0x01);

                int t = 0;
                if(msg.msg_type != null)
                {
                    t = msg.msg_type.length();
                }
                if(t != 2)
                {
                    return;
                }

                int s = 0;
                if(msg.systemID!=null)
                {
                    s = msg.systemID.length();
                }

                int c = 0;
                if(msg.content != null)
                {
                    //todo 加密
                    if(msg.msg_type.equals(MsgType.MSG_ENCRYPTED.getValue())
                    || msg.msg_type.equals(MsgType.HEART_BEAT.getValue())){
                        msg.content = AesUtil.aesEncode(msg.content);
                    }
                    if(msg.msg_type.equals(MsgType.MSG_CONFIG.getValue()) || msg.msg_type.equals(MsgType.RELAY.getValue())){
                        msg.content = HexUtil.decodeHex(new String(msg.content));
                    }
                    c = msg.content.length;
                }

                int len = t + s + c + 8;
                String slen = String.format("%04X", len);
                out.writeBytes(slen.getBytes());

                byte[] arr = new byte[t + s + c];
                System.arraycopy(msg.msg_type.getBytes(), 0, arr, 0, t);
                if(s>0)
                {
                    System.arraycopy(msg.systemID.getBytes(), 0, arr, t, s);
                }
                if(c > 0)
                {
                    System.arraycopy(msg.content, 0, arr, t+s, c);
                }      
                out.writeBytes(arr);
                
                byte[] check = Helper.checksum(arr).getBytes();
                out.writeBytes(check);

                out.writeByte(0x03);
        } 
        catch (Exception e) {
            MyLogger.Error("encode package error: " + e.getMessage());
            ctx.close();
        }
    }
    
}